/**********************************************************************************
 * 文件名称：
 * 功能说明：
 * 作者：laud（qq：554163925）
 * 修改记录
 *
**********************************************************************************/
#include "gsm.h"
#include "gsm_common.h"
#include "gsm_network.h"

/* 网络状态 */
static bool networkStatus = false;

static Serial_IfTypedef   usart;
static Network_IfTypedef  network;
static PDP_IfTypedef      pdp;
static SIM_IfTypedef      sim;


static MDM_DevTypedef    gsm_xx =
{ 	
	false, 
	&usart,
    &network, 
    &pdp, 
    &sim, 
	NULL, 
	SIM_UNKNOWN,
	NULL,
	MDM_UNINITIALIZED 
};


/* 静态函数 */
void network_get_current_status ( uint8_t type, NetworkStatus status );
static uint8_t MDM_Handler_UnsRsp ( MDM_CmdTypedef *at, MDM_RspTypedef *response );
static void network_create_socket_service(void* ipc_data);

/*
**************************************************************************
* 函数名称： GSMxx_FlowCtrlHandler
* 功能描述： 通信模块的流控
* 输入参数： 
* 输出参数： 
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/09/20	  	V1.1.0	     goly         XXXX
***************************************************************************
*/

#define GSM_MODEM_FLOW_DEBUG   0

static bool GSMxx_FlowCtrlHandler ( mdm_fcmEvent_e Event )
{
    switch ( Event )
    {
        /* 流打开事件 */
        case MDM_FCM_EVENT_FLOW_OPENNED:  
#if GSM_MODEM_FLOW_DEBUG == 1
            printf ( "\r\n[GSM_xx FLW]: modem flow is open\r\n" );
#endif
            /* 默认模块状态为AT指令通信 */
            MDM_FlowSwitchV24State ( MDM_FCM_V24_STATE_AT );
        break;

        /* 流AT模式切换 */
        case MDM_FCM_EVENT_V24_AT_MODE_FROM_CALL: 
        break;

        /* 流进入AT模式 */
        case MDM_FCM_EVENT_V24_AT_MODE:
#if GSM_MODEM_FLOW_DEBUG == 1
        printf ( "\r\n[GSM_xx FLW]: modem is at mode\r\n" );
#endif
        break;

        /* 流数据模式切换 */
        case MDM_FCM_EVENT_V24_DATA_MODE_FROM_CALL:
        break;

        /* 流进入数据模式 */
        case MDM_FCM_EVENT_V24_DATA_MODE:
#if GSM_MODEM_FLOW_DEBUG == 1
        printf ( "\r\n[GSM_xx FLW]: modem is data mode\r\n" );
#endif

        break;

        /* 流关闭事件 */
        case MDM_FCM_EVENT_FLOW_CLOSED:
#if 0	
        SIO_Close ();
#endif
        break;
        case MDM_FCM_EVENT_RESUME:
        break;

        /* MODEM切换超时 */
        case MDM_FCM_EVENT_SWITCH_TO:
        break;

        /* MODEM切换失败或拨号失败******* */
        case MDM_FCM_EVENT_SWITCH_ERR:
        case MDM_FCM_EVENT_DIAL_ERR:
        /*做相关参数保存*/
        break;
    }
    return true;
}



/* 
 * 功能描述：
 * 引用参数：无
 *          
 * 返回值  ：无
 * 
 */

#define SIM_NETWORK_DEBUG  				0
extern void sim_current_status ( SIM_Status status )
{
  switch ( status )
  {
		case SIM_INIT:
			break;
    case SIM_UNKNOWN:
#if SIM_NETWORK_DEBUG == 1
{
      //PRINTF_GPS_TIME ();
      printf ( "[SIM EVENT] SIM UNKNOWN\r\n" );
}
#endif  /* SIM_NETWORK_DEBUG */

    case SIM_MISSING:
#if SIM_NETWORK_DEBUG == 1
{
      //PRINTF_GPS_TIME ();
      printf ( "[SIM EVENT] SIM MISSING\r\n" );
}
#endif  /* SIM_NETWORK_DEBUG */

    case SIM_ERROR:
#if SIM_NETWORK_DEBUG == 1
{
      //PRINTF_GPS_TIME ();
      printf ( "[SIM EVENT] SIM ERROR\r\n" );
}
#endif  /* SIM_NETWORK_DEBUG */
//      /* 延时复位 */
      //TMR_Subscribe ( false, 10, TMR_TYPE_100MS, ( tmr_procTriggerHdlr_t )system_reset );
      break;

    case SIM_NEED_PIN:
#if SIM_NETWORK_DEBUG == 1
{
      //PRINTF_GPS_TIME ();
      printf ( "[SIM EVENT] SIM NEED PIN\r\n" );
}
#endif  /* SIM_NETWORK_DEBUG */
      break;

    case SIM_NEED_PUK:
#if SIM_NETWORK_DEBUG == 1
{
      //PRINTF_GPS_TIME ();
      printf ( "[SIM EVENT] SIM NEED PUK\r\n" );
}
#endif  /* SIM_NETWORK_DEBUG */
      break;

    case SIM_READY:
#if SIM_NETWORK_DEBUG == 1
{
      //PRINTF_GPS_TIME ();
      printf ( "[SIM EVENT] SIM READY\r\n" );
}
#endif  /* SIM_NETWORK_DEBUG */
      networkStatus = false;

      break;
  }
}



/* 通信模块初始化 */
void GSMxx_IfInit(void)
{
    if ( gsm_xx.serial )
	{
        gsm_xx.serial->write_data = MODEM_WriteData;
        gsm_xx.serial->read_data  = MODEM_ReadData;
        gsm_xx.status = MDM_SERIAL_INIT;
        gsm_xx.serial->response_unidentified = MDM_Handler_UnsRsp;
        MDM_FlowServiceStart( GSMxx_FlowCtrlHandler );
	}
    if ( gsm_xx.pdp )
    {
        gsm_xx.pdp->socket_open=network_create_socket_service;
    }
    if ( gsm_xx.network )
    {
        gsm_xx.network->status = network_get_current_status;
    }
    if ( gsm_xx.sim )
    {
        gsm_xx.sim->generalAtWithSIMReady = MDM_GeneralAtInitWithSIMReady;
        gsm_xx.sim->auth_status = sim_current_status;
    }
    gsm_xx.sim_status = SIM_UNKNOWN;	  /* 状态切换 */
    gsm_xx.is_timeout = false;
    
    MDM_IfInit( (MDM_DevTypedef * )&gsm_xx );
    printf("\r\n.GSMxx_IfInit");
}


bool GSMxx_WriteData ( uint8_t FlowType, uint8_t Data[], uint16_t DataSize )
{
	uint16_t dataLen = DataSize;
	bool IsOk=false;
	FlowType=FlowType;
    
    comSendBuf(COM2,Data,dataLen);	
    
    return IsOk;
}

bool GSMxx_ReadData ( uint16_t DataSize, uint8_t *Data )
{ 
	  if(MDM_QueryFlowStatus () == MDM_FCM_V24_STATE_AT )
		{
			  MDM_ReadData ( DataSize, Data );	
		}
//		else if ( MDM_QueryFlowStatus () == MDM_FCM_V24_STATE_DATA )//有问题时，去掉此处判断条件
//		{
//				MDM_GPRS_ReadData( DataSize, Data );
//		}
		 
		return false;
}

static void network_attach_delay ( uint8_t ID )
{
		lgsm_network_get_gprs_status(NULL);
}
/*
**************************************************************************
* 函数名称： network_get_current_status
* 功能描述： 获取当前网络状态
* 输入参数： NULL
* 输出参数： NULL
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/09/29	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
void network_get_current_status ( uint8_t type, NetworkStatus status )
{ 
    if ( GPRS_NETWORK_TYPE == type )
    {
        switch ( status )
        {
            case NETWORK_UNKNOWN:
            case NETWORK_UNREGISTERED:
                {
                networkStatus = false;
                TMR_Subscribe ( false, 30, TMR_TYPE_100MS, ( tmr_procTriggerHdlr_t )network_attach_delay );
                }
            break;
            case NETWORK_ROAMING:
            case NETWORK_REGISTERED:
                if ( networkStatus == false )
                {  	   
//                network_enter_pdp_service();
                }
                networkStatus = true;
            break;
            case NETWORK_BUSY:
                {
                TMR_Subscribe ( false, 30, TMR_TYPE_100MS, ( tmr_procTriggerHdlr_t )network_attach_delay );
                }
            break;
            case NETWORK_DENIED:
                networkStatus = false;
                printf("\r\nSIM card arrears......\r\n");       //欠费
            break;
        }
    }
	else
        if(GSM_NETWORK_TYPE==type)
        {
            
            switch ( status )
            {
                case NETWORK_UNREGISTERED:
                {
                networkStatus = false;
                TMR_Subscribe ( false, 30, TMR_TYPE_100MS, ( tmr_procTriggerHdlr_t )network_attach_delay );
                }
                break;
                case    NETWORK_REGISTERED:
                case    NETWORK_BUSY:
                case	NETWORK_DENIED:
                case	NETWORK_UNKNOWN:
                case	NETWORK_ROAMING:
                break;
            }
        }
}

/*
**************************************************************************
* 函数名称： CommunicationLinkCreate
* 功能描述： 创建通信链路
* 输入参数： 
* 输出参数： 
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/10/12	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
//正常部署的服务器
#define  SERVER_ADDRESS									"103.46.128.41"		//58.213.83.82		103.46.128.41
#define  SERVER_PORT										39786

extern void CommunicationLinkCreate (void)
{
       MDM_ClientCreate("TCP",SERVER_ADDRESS,SERVER_PORT);
}

/*
**************************************************************************
* 函数名称： network_create_socket_service
* 功能描述： 创建TCP客户端
* 输入参数： NULL
* 输出参数： NULL
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/09/29	  	V1.1.0	     goly         XXXX
***************************************************************************
*/

static void network_create_socket_service (void* ipc_data)
{
    CommunicationLinkCreate();
}

/*
**************************************************************************
* 函数名称： MDM_Handler_UnsRsp
* 功能描述： 对未识别的响应的处理
* 输入参数： 
* 输出参数： 
* 返 回 值： 
* 其它说明： 在这里的判断一定需要把OK这个标志去除,因为OK很有可能和其它内容一起
* 到来,这样会被OK覆盖
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/10/12	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
static uint8_t MDM_Handler_UnsRsp ( MDM_CmdTypedef *at, MDM_RspTypedef *response )
{
    MDM_RSP_ID code = MDM_GetResultCode ( response );
    AtCmdHandler_Status at_status = AT_HANDLER_DONT_UNDERSTAND;

    /* Running our default handler */
    switch ( code )
    {
        case MDM_BUSY:	/* remote hangup the call */
            at_status = AT_HANDLER_DONE;
        break;

        case MDM_NO_ANSWER:
            at_status = AT_HANDLER_DONE;
        break;

        case MDM_NO_CARRIER:
            at_status = AT_HANDLER_DONE;
        break;

        case MDM_CONNECT:
            MDM_FlowSwitchV24State ( MDM_FCM_V24_STATE_DATA );
            at_status = AT_HANDLER_DONE;
        break;
        case MDM_SEND_OK:
            at_status = AT_HANDLER_DONE;
        break;
    }
    return at_status;
}



